package ar.edu.utn.frba.disenio.aterrizar.ui.arena;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.bindings.ObservableProperty;
import org.uqbar.arena.bindings.PropertyAdapter;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.Selector;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.commons.model.UserException;
import org.uqbar.lacar.ui.model.ListBuilder;
import org.uqbar.lacar.ui.model.bindings.Binding;
import org.uqbar.ui.jface.builder.ErrorsPanel;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Vuelo;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.SobreReservarException;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.repociudades.Ciudad;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.repociudades.RepositorioCiudades;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.transformers.AsientoTransformer;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.transformers.ClaseTransformer;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.transformers.PrecioTransformer;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.transformers.UbicacionTransformer;
import ar.edu.utn.frba.disenio.aterrizar.ui.arena.transformers.VueloTransformer;

public class BuscadorWindow extends ListadoWindow<BuscadorAsientos>{
	
	private RepositorioCiudades repo = RepositorioCiudades.getInstance();
	
	public BuscadorWindow(WindowOwner owner, BuscadorAsientos model) {
		super(owner, model);
		this.setMensaje("Busquedas de ");
		this.setBusqueda("resultados");
	}
	
	@Override
	public void createContents(Panel mainPanel) {
		super.createContents(mainPanel);
		mainPanel.setLayout(new VerticalLayout());
		this.createErrorsPanel(mainPanel);
		this.createFormPanel(mainPanel);
		this.addActions(mainPanel);
		Table<Vuelo> table = this.crearGrid(mainPanel);
		this.descripcionTabla(table);
		this.createGridActions(mainPanel);
	}
	
	@Override
    protected ErrorsPanel createErrorsPanel(Panel mainPanel)
    {
		this.setTaskDescription("Ingrese parametros para la busqueda");
		return super.createErrorsPanel(mainPanel);
    }
	 
	@Override
	protected void createFormPanel(Panel mainPanel) {
		
		Panel searchFormPanel = new Panel(mainPanel);
		searchFormPanel.setLayout(new ColumnLayout(4));

		new Label(searchFormPanel).setText("Origen");
		Selector<Ciudad> unSelector = new Selector<Ciudad>(searchFormPanel).allowNull(false);
		unSelector.bindValueToProperty("origen");
		this.itemBinding(unSelector);
			
		new Label(searchFormPanel).setText("Destino");
		Selector<Ciudad> otroSelector = new Selector<Ciudad>(searchFormPanel).allowNull(false);
		otroSelector.bindValueToProperty("destino");
		this.itemBinding(otroSelector);		
	
		new Label(searchFormPanel).setText("Fecha");
		new TextBox(searchFormPanel)//
		.setWidth(100)
		.bindValueToProperty("fecha");
		
	}	

	private void itemBinding(Selector<Ciudad> selector) {
		Binding<ListBuilder<Ciudad>> itemsBinding = selector.bindItems( //
				new ObservableProperty(repo, "ciudades"));
			itemsBinding.setAdapter( //
				new PropertyAdapter(Ciudad.class, "nombreCiudad"));
	}
	
	@Override
	protected void addActions(Panel actionsPanel) {
		
		Panel aPanel = new Panel(actionsPanel);
		aPanel.setLayout(new HorizontalLayout());
		
		new Button(aPanel)//
		.setCaption("Buscar")
		.onClick(new MessageSend(this.getModelObject(), "search"))
		.setAsDefault()
		.disableOnError();
	}
	
	protected Table<Vuelo> crearGrid(Panel mainPanel) {
		Table<Vuelo> table = super.crearGrid(mainPanel);
		table.bindValueToProperty("vueloSeleccionado");		
		return table;
	}
	
	protected void descripcionTabla(Table<Vuelo> table){
	
		Column<Vuelo> aerolinea = new Column<Vuelo>(table);
		aerolinea.setTitle("Aerolinea");
		aerolinea.setFixedSize(100);
		aerolinea.bindContentsToProperty("aerolinea");

		Column<Vuelo> vuelo = new Column<Vuelo>(table);
		vuelo.setTitle("Vuelo");
		vuelo.setFixedSize(100);
		vuelo.bindContentsToTransformer(new VueloTransformer());
		
		Column<Vuelo> asiento = new Column<Vuelo>(table);
		asiento.setTitle("Asiento");
		asiento.setFixedSize(100);
		asiento.bindContentsToTransformer(new AsientoTransformer());
		
		Column<Vuelo> precio = new Column<Vuelo>(table);
		precio.setTitle("Precio");
		precio.setFixedSize(100);
		precio.bindContentsToTransformer(new PrecioTransformer());
		
		Column<Vuelo> ubicacion = new Column<Vuelo>(table);
		ubicacion.setTitle("Ubicacion");
		ubicacion.setFixedSize(100);
		ubicacion.bindContentsToTransformer(new UbicacionTransformer());
		
		Column<Vuelo> clase = new Column<Vuelo>(table);
		clase.setTitle("Clase");
		clase.setFixedSize(100);
		clase.bindContentsToTransformer(new ClaseTransformer());	
		
	}

	protected void createGridActions(Panel mainPanel) {
		Panel aPanel = new Panel(mainPanel);
		aPanel.setLayout(new HorizontalLayout());
			
		Button comprar = new Button(aPanel);
		comprar.setCaption("Comprar");
		comprar.onClick(new MessageSend(this, "comprar"));
		
		Button reservar = new Button(aPanel);
		reservar.setCaption("Reservar");
		reservar.onClick(new MessageSend(this, "reservar"));
		
		super.actionPanel(aPanel);
		
		// Deshabilitar botones si no hay ningún elemento seleccionado en la grilla.
		NotNullObservable elementSelected = new NotNullObservable("vueloSeleccionado");
		comprar.bindEnabled(elementSelected);
		reservar.bindEnabled(elementSelected);
	}
	
	public void comprar(){
		try{
			this.getModelObject().comprar();	
		}catch(UserException e){
			new MessageWindow(this, e).open();	
		}finally{
			this.getModelObject().search();
		}
	}
	
	public void reservar(){
		try{
			this.getModelObject().reservar();	
		}catch(UserException e){
			new MessageWindow(this, e).open();
		}catch(SobreReservarException e){
			new SobreReservaWindow(this, this.getModelObject(), e.errorMessage()).open();
		}finally{
			this.getModelObject().search();
		}
	}
	
}
